package Interfaz;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Button;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.ScrolledComposite;

import DTO.DTONuevaCompetencia;
import Excepcion.NombreCaracterException;
import Excepcion.TamReglamentoInvalidoException;
import Negocios.ValidacionString;
import Persistencia.DAO.DAOCompetencia;
import Persistencia.DAO.DAOUsuario;
import Persistencia.Entidad.Deporte;
import Persistencia.Entidad.LugarDeCompetencia;
import Persistencia.Entidad.ModalidadDeCompetencia;
import Persistencia.Entidad.Usuario;


/**
 * CU004 - Dar de alta competencia deportiva
 * @author 
 */
public class CU004 {

	protected Shell shlNueva;
	private Text txtNombre;
	private Text txtReglamento;
	
	private Combo comboDeporte;
	private Combo comboModalidad;
	
	private CTabFolder tabFolder;
	
	private Usuario usuario;
	private ArrayList<Integer> idDeporte = new ArrayList<Integer>();
	private ArrayList<Integer> idModalidad = new ArrayList<Integer>();
	private HashMap<Button,Text> btnLugares = new HashMap<Button,Text>();
	private HashMap<Button,Integer> idLugar = new HashMap<Button,Integer>();
	
	private DTONuevaCompetencia dtoNuevaCompetencia = null;
	
	private CU004 myself;
	private Object siguientePantalla = null;
	private CU003 pantallaAnterior;
	
	public CU004(Integer idUsuario, CU003 pantallaAnterior) {
		myself = this;
		DAOUsuario daoUsuario = new DAOUsuario();
		usuario = daoUsuario.getUsuario(idUsuario);
		this.pantallaAnterior = pantallaAnterior;
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		
		// Centrar ventana
		Monitor primary = display.getPrimaryMonitor();
		Rectangle bounds = primary.getBounds();
		Rectangle rect = shlNueva.getBounds();
		int x = bounds.x + (bounds.width - rect.width) / 2;
		int y = bounds.y + (bounds.height - rect.height) / 2;	    
		shlNueva.setLocation(x, y);
		
		Label lblNombreDeCompetencia = new Label(shlNueva, SWT.NONE);
		lblNombreDeCompetencia.setText("Nombre:");
		lblNombreDeCompetencia.setBounds(10, 23, 47, 15);
		
		txtNombre = new Text(shlNueva, SWT.BORDER);
		txtNombre.setBounds(63, 20, 219, 21);
		txtNombre.addFocusListener(new FocusListener() {
			public void focusGained(FocusEvent e) {
				txtNombre.setBackground(SWTResourceManager.getColor(255, 255, 255));
		    }
			
		    public void focusLost(FocusEvent e) {
		    	try {
					ValidacionString.validarNombreCompetencia(txtNombre.getText());
				}
				catch (NombreCaracterException ex) {
					txtNombre.setBackground(SWTResourceManager.getColor(255, 153, 153));
				}
		    }
		});
		
		comboDeporte = new Combo(shlNueva, SWT.READ_ONLY);
		
		DAOCompetencia daoCompetencia = new DAOCompetencia();
		ArrayList<Deporte> deportes = daoCompetencia.getDeportes();
		String[] nombresDeportes = new String[deportes.size()];
		int i = 0;
		for (Deporte d : deportes) {
			nombresDeportes[i++] = d.getNombre();
			idDeporte.add(d.getId());
		}
		
		comboDeporte.setItems(nombresDeportes);
		comboDeporte.setBounds(61, 60, 128, 23);
		
		Label lblNewLabel = new Label(shlNueva, SWT.NONE);
		lblNewLabel.setBounds(10, 63, 45, 15);
		lblNewLabel.setText("Deporte:");
		
		Label lblModalidad = new Label(shlNueva, SWT.NONE);
		lblModalidad.setText("Modalidad:");
		lblModalidad.setBounds(10, 103, 60, 15);
		
		comboModalidad = new Combo(shlNueva, SWT.READ_ONLY);
		
		ArrayList<ModalidadDeCompetencia> modalidades = daoCompetencia.getModalidades();		
		String[] nombresModalidades = new String[modalidades.size()];		
		i = 0;		
		for (ModalidadDeCompetencia mod : modalidades) {		
			nombresModalidades[i++] = mod.getDescripcion();
			idModalidad.add(mod.getId());
			//System.out.println("idModalidad[" + (i - 1) + "] = " + idModalidad.get(i - 1));
		}		
		
		comboModalidad.setItems(nombresModalidades);
		
		comboModalidad.setBounds(76, 100, 128, 23);
		
		Button button = new Button(shlNueva, SWT.NONE);
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				shlNueva.close();
			}
		});
		button.setText("Cancelar");
		button.setBounds(341, 414, 108, 32);
		
		Button btnContinuar = new Button(shlNueva, SWT.NONE);
		btnContinuar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				/*MessageBox messageBox = new MessageBox(shlNueva, SWT.ICON_INFORMATION);
				StringBuilder mensaje = new StringBuilder();
				mensaje.append("Id Deporte: " + idDeporte.get(comboDeporte.getSelectionIndex()) + "\n");
				mensaje.append("Id ModalidadDeCompetencia: " + idModalidad.get(comboModalidad.getSelectionIndex()) + "\n");
				
				Iterator it = btnLugares.entrySet().iterator();
				while (it.hasNext()) {
					Map.Entry<Button,Text> entry = (Map.Entry<Button,Text>)it.next();
					if (entry.getKey().getSelection()) {
						mensaje.append("Id LugarDeCompetencia seleccionado: " + idLugar.get(entry.getKey())
								+ " (" + entry.getValue().getText() + ")\n");
					}
				}
				
				messageBox.setMessage(mensaje.toString());
				messageBox.open();*/
				
				if (datosValidos()) {
					shlNueva.setVisible(false);
					
					if (dtoNuevaCompetencia == null) {
						llenarDTO();
						
						try {
							switch (idModalidad.get(comboModalidad.getSelectionIndex())) {
								case 1:
									siguientePantalla = new CU004_liga(myself, dtoNuevaCompetencia);
									((CU004_liga) siguientePantalla).open();
									break;
								case 2:
									siguientePantalla = new CU004_elim_simple(myself, dtoNuevaCompetencia);
									((CU004_elim_simple) siguientePantalla).open();
									break;
								case 3:
									siguientePantalla = new CU004_elim_doble(myself, dtoNuevaCompetencia);
									((CU004_elim_doble) siguientePantalla).open();
									break;
							}
						}
						catch (Exception ex) {
							ex.printStackTrace();
						}
					}
					else {
						// Actualizar DTO de siguiente pantalla,
						// ocultar actual y mostrar siguiente
						try {
							if (siguientePantalla instanceof CU004_liga) {
								if (idModalidad.get(comboModalidad.getSelectionIndex()) != 1) {
									dtoNuevaCompetencia = null;
									llenarDTO();
									
									switch (idModalidad.get(comboModalidad.getSelectionIndex())) {
										case 2:
											siguientePantalla = new CU004_elim_simple(myself, dtoNuevaCompetencia);
											((CU004_elim_simple) siguientePantalla).open();
											break;
										case 3:
											siguientePantalla = new CU004_elim_doble(myself, dtoNuevaCompetencia);
											((CU004_elim_doble) siguientePantalla).open();
											break;
									}
								}
								else {
									llenarDTO();
									((CU004_liga) siguientePantalla).updateDTO(dtoNuevaCompetencia);
									((CU004_liga) siguientePantalla).shlNueva_liga.setVisible(true);
								}
							}
							else if (siguientePantalla instanceof CU004_elim_simple) {
								if (idModalidad.get(comboModalidad.getSelectionIndex()) != 2) {
									dtoNuevaCompetencia = null;
									llenarDTO();
									
									switch (idModalidad.get(comboModalidad.getSelectionIndex())) {
										case 1:
											siguientePantalla = new CU004_liga(myself, dtoNuevaCompetencia);
											((CU004_liga) siguientePantalla).open();
											break;
										case 3:
											siguientePantalla = new CU004_elim_doble(myself, dtoNuevaCompetencia);
											((CU004_elim_doble) siguientePantalla).open();
											break;
									}
								}
								else {
									llenarDTO();
									((CU004_elim_simple) siguientePantalla).updateDTO(dtoNuevaCompetencia);
									((CU004_elim_simple) siguientePantalla).shlNueva_eliminatoria.setVisible(true);
								}
							}
							else if (siguientePantalla instanceof CU004_elim_doble) {
								if (idModalidad.get(comboModalidad.getSelectionIndex()) != 3) {
									dtoNuevaCompetencia = null;
									llenarDTO();
									
									switch (idModalidad.get(comboModalidad.getSelectionIndex())) {
										case 1:
											siguientePantalla = new CU004_liga(myself, dtoNuevaCompetencia);
											((CU004_liga) siguientePantalla).open();
											break;
										case 2:
											siguientePantalla = new CU004_elim_simple(myself, dtoNuevaCompetencia);
											((CU004_elim_simple) siguientePantalla).open();
											break;
									}
								}
								else {
									llenarDTO();
									((CU004_elim_doble) siguientePantalla).updateDTO(dtoNuevaCompetencia);
									((CU004_elim_doble) siguientePantalla).shlNueva_eliminatoria.setVisible(true);
								}
							}
						}
						catch (Exception ex) {
							ex.printStackTrace();
						}
					}
				}
			}
		});
		btnContinuar.setText("Siguiente >>");
		btnContinuar.setBounds(209, 414, 108, 32);
		
		tabFolder = new CTabFolder(shlNueva, SWT.BORDER);
		tabFolder.setBounds(10, 143, 450, 250);
		tabFolder.setSelectionBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
		
		CTabItem pestanhaLugares = new CTabItem(tabFolder, SWT.NONE);
		pestanhaLugares.setText("Lugares");
		
		ScrolledComposite scrolledComposite_1 = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.V_SCROLL);
		scrolledComposite_1.setAlwaysShowScrollBars(true);
		scrolledComposite_1.setExpandHorizontal(true);
		pestanhaLugares.setControl(scrolledComposite_1);
		scrolledComposite_1.setExpandVertical(true);
		
		Composite composite_1 = new Composite(scrolledComposite_1, SWT.NONE);
		
		Label lblPartidos = new Label(composite_1, SWT.NONE);
		lblPartidos.setBounds(192, 10, 55, 15);
		lblPartidos.setText("PARTIDOS:");
		
		int coordY = 36;
		
		List<LugarDeCompetencia> lugares = usuario.getLugares();
		
		for (LugarDeCompetencia lugar : lugares) {
			final Button checkPartido = new Button(composite_1, SWT.CHECK);
			
			final Text textPartidos = new Text(composite_1, SWT.BORDER);
			textPartidos.setEnabled(false);
			textPartidos.setText("0");
			textPartidos.setBounds(198, coordY - 2, 42, 21);
			textPartidos.addFocusListener(new FocusListener() {
				public void focusGained(FocusEvent e) {
					textPartidos.setBackground(SWTResourceManager.getColor(255, 255, 255));
			    }
				
			    public void focusLost(FocusEvent e) {
			    	try {
			    		if (checkPartido.getSelection() && Integer.parseInt(textPartidos.getText()) <= 0) {
			    			textPartidos.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    		}
			    	}
			    	catch (NumberFormatException ex) {
			    		textPartidos.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    	}
			    }
			});
			
			checkPartido.setBounds(10, coordY, 118, 16);
			checkPartido.setText(lugar.getNombre());
			checkPartido.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent event) {
					textPartidos.setEnabled(checkPartido.getSelection());
				}
			});
			
			btnLugares.put(checkPartido, textPartidos);
			idLugar.put(checkPartido, lugar.getId());
			
			coordY += 25;
		}
		scrolledComposite_1.setContent(composite_1);
		scrolledComposite_1.setMinSize(composite_1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		CTabItem pestanhaReglamento = new CTabItem(tabFolder, SWT.NONE);
		pestanhaReglamento.setText("Reglamento");
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(tabFolder, SWT.BORDER);
		pestanhaReglamento.setControl(scrolledComposite);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		Composite composite = new Composite(scrolledComposite, SWT.NONE);
		
		txtReglamento = new Text(composite, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI);
		txtReglamento.setBounds(7, 45, 425, 166);
		txtReglamento.addFocusListener(new FocusListener() {
			public void focusGained(FocusEvent e) {
				txtReglamento.setBackground(SWTResourceManager.getColor(255, 255, 255));
		    }
			
		    public void focusLost(FocusEvent e) {
		    	if (!txtReglamento.getText().isEmpty()) {
		    		try {
						ValidacionString.validarReglamento(txtReglamento.getText());
					}
			    	catch (TamReglamentoInvalidoException ex) {
						txtReglamento.setBackground(SWTResourceManager.getColor(255, 153, 153));
					}
		    	}
		    }
		});
		
		Button button_1 = new Button(composite, SWT.NONE);
		button_1.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/square_shape_icon&16.png"));
		button_1.setBounds(250, 10, 26, 26);
		
		Button button_2 = new Button(composite, SWT.NONE);
		button_2.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/align_right_icon&16.png"));
		button_2.setBounds(218, 10, 26, 26);
		
		Button button_3 = new Button(composite, SWT.NONE);
		button_3.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/align_center_icon&16.png"));
		button_3.setBounds(186, 10, 26, 26);
		
		Button button_4 = new Button(composite, SWT.NONE);
		button_4.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/align_left_icon&16.png"));
		button_4.setBounds(154, 10, 26, 26);
		
		Button button_5 = new Button(composite, SWT.NONE);
		button_5.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/font_underline_icon&16.png"));
		button_5.setBounds(122, 10, 26, 26);
		
		Button button_6 = new Button(composite, SWT.NONE);
		button_6.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/font_italic_icon&16.png"));
		button_6.setBounds(90, 10, 26, 26);
		
		Button button_7 = new Button(composite, SWT.NONE);
		button_7.setImage(SWTResourceManager.getImage(CU004.class, "/Interfaz/Images/font_bold_icon&16.png"));
		button_7.setBounds(58, 10, 26, 26);
		
		Combo combo_3 = new Combo(composite, SWT.READ_ONLY);
		combo_3.setItems(new String[] {"8", "9", "10", "11", "12", "14", "16"});
		combo_3.setBounds(10, 11, 42, 23);
		combo_3.select(4);
		scrolledComposite.setContent(composite);
		scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		tabFolder.setSelection(0);
		
		shlNueva.open();
		shlNueva.layout();
		while (!shlNueva.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	protected boolean datosValidos() {
		try {
			ValidacionString.validarNombreCompetencia(txtNombre.getText());
		}
		catch (NombreCaracterException ex) {
			txtNombre.setBackground(SWTResourceManager.getColor(255, 153, 153));
			
			MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
			error.setMessage("Nombre inv\u00E1lido.\n"
					+ "Debe contener entre 6 (seis) y 30 (treinta) caracteres.\n"
					+ "Caracteres v\u00E1lidos: A-Z a-z [espacio] 0-9 . - _");
			error.open();
			
			return false;
		}
		
		if (comboDeporte.getSelectionIndex() == -1) {
			MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
			error.setMessage("Debe seleccionar un deporte de la lista.");
			error.open();
			
			return false;
		}
		
		if (comboModalidad.getSelectionIndex() == -1) {
			MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
			error.setMessage("Debe seleccionar una modalidad de la lista.");
			error.open();
			
			return false;
		}
		
		boolean alMenosUnClubSeleccionado = false;
		Iterator it = btnLugares.entrySet().iterator();
		
		while (it.hasNext()) {
			Map.Entry<Button,Text> entry = (Map.Entry<Button,Text>)it.next();
			if (entry.getKey().getSelection()) {
				alMenosUnClubSeleccionado = true;
				break;
			}
		}
		
		if (!alMenosUnClubSeleccionado) {
			tabFolder.setSelection(0);
			
			MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
			error.setMessage("Debe seleccionar al menos un lugar de la lista.");
			error.open();
			
			return false;
		}
		
		boolean enteroInvalido = false;
		it = btnLugares.entrySet().iterator();
		
		while (it.hasNext()) {
			Map.Entry<Button,Text> entry = (Map.Entry<Button,Text>)it.next();
			if (entry.getKey().getSelection()) {
				try {
		    		if (Integer.parseInt(entry.getValue().getText()) <= 0) {
		    			entry.getValue().setBackground(SWTResourceManager.getColor(255, 153, 153));
		    			enteroInvalido = true;
		    		}
		    	}
		    	catch (NumberFormatException ex) {
		    		entry.getValue().setBackground(SWTResourceManager.getColor(255, 153, 153));
		    		enteroInvalido = true;
		    	}
			}
		}
		
		if (enteroInvalido) {
			tabFolder.setSelection(0);
			
			MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
			error.setMessage("Cantidad de partidos inv\u00E1lida.\n"
					+ "Debe ingresar un valor entero positivo.");
			error.open();
			
			return false;
		}
		
		if (!txtReglamento.getText().isEmpty()) {
    		try {
				ValidacionString.validarReglamento(txtReglamento.getText());
			}
	    	catch (TamReglamentoInvalidoException ex) {
	    		tabFolder.setSelection(1);
				txtReglamento.setBackground(SWTResourceManager.getColor(255, 153, 153));
				
				MessageBox error = new MessageBox(shlNueva, SWT.ICON_ERROR);
				error.setMessage("Reglamento inv\u00E1lido.\n"
						+ "Debe contener entre 10 (diez) y 500 (quinientos) caracteres.");
				error.open();
				
				return false;
			}
    	}
		
		return true;
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shlNueva = new Shell(SWT.CLOSE | SWT.TITLE | SWT.MIN);
		shlNueva.setSize(476, 490);
		shlNueva.setText("Nueva competencia");
		shlNueva.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event event) {
				pantallaAnterior.llenarTabla();
				pantallaAnterior.shlBuscarCompetencias.setVisible(true);
				pantallaAnterior.shlBuscarCompetencias.forceFocus();
			}
		});
	}
	
	protected void llenarDTO() {
		// Limpio DTO
		if (dtoNuevaCompetencia != null) {
			dtoNuevaCompetencia.setNombreCompetencia(null);
			dtoNuevaCompetencia.setReglamento(null);
		}
		
		ArrayList<ArrayList<Integer>> lugares = new ArrayList<ArrayList<Integer>>();
		
		Iterator it = btnLugares.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<Button,Text> entry = (Map.Entry<Button,Text>)it.next();
			if (entry.getKey().getSelection()) {
				ArrayList<Integer> lugar = new ArrayList<Integer>();
				lugar.add(idLugar.get(entry.getKey()));
				lugar.add(Integer.parseInt(entry.getValue().getText()));
				lugares.add(lugar);
			}
		}
		
		if (dtoNuevaCompetencia == null) {
			dtoNuevaCompetencia = new DTONuevaCompetencia(usuario.getId(), txtNombre.getText(),
					idDeporte.get(comboDeporte.getSelectionIndex()), lugares,
					idModalidad.get(comboModalidad.getSelectionIndex()), txtReglamento.getText(),
					-1, -1, -1, -1, -1, -1);
		}
		else {
			dtoNuevaCompetencia.setIdUsuario(usuario.getId());
			dtoNuevaCompetencia.setNombreCompetencia(txtNombre.getText());
			dtoNuevaCompetencia.setIdDeporte(idDeporte.get(comboDeporte.getSelectionIndex()));
			dtoNuevaCompetencia.setLugares(lugares);
			dtoNuevaCompetencia.setIdModalidad(idModalidad.get(comboModalidad.getSelectionIndex()));
			dtoNuevaCompetencia.setReglamento(txtReglamento.getText());
		}
	}

	public void updateDTO(DTONuevaCompetencia dtoNuevaCompetencia) {
		dtoNuevaCompetencia.setPuntosPorVictoria(dtoNuevaCompetencia.getPuntosPorVictoria());
		dtoNuevaCompetencia.setPuntosPorEmpate(dtoNuevaCompetencia.getPuntosPorEmpate());
		dtoNuevaCompetencia.setPuntosPorPresencia(dtoNuevaCompetencia.getPuntosPorPresencia());
		dtoNuevaCompetencia.setPuntosPorAusencia(dtoNuevaCompetencia.getPuntosPorAusencia());
		dtoNuevaCompetencia.setSets(dtoNuevaCompetencia.getSets());
		dtoNuevaCompetencia.setPuntuacion(dtoNuevaCompetencia.getPuntuacion());
	}
}
